home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_se / ifthenelse.e < prev    next >
Text File  |  2000-03-25  |  5KB  |  232 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr
  4. --                       http://SmallEiffel.loria.fr
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License
  11. -- for  more  details.  You  should  have  received a copy of the GNU General
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. class IFTHENELSE
  17.    --
  18.    -- The conditionnal instruction : 
  19.    --              "if ... then ... elseif ... else ... end".
  20.    --
  21.  
  22. inherit INSTRUCTION; IF_GLOBALS;
  23.  
  24. creation make
  25.  
  26. feature
  27.  
  28.    start_position: POSITION;
  29.      -- Of keyword "if".
  30.  
  31.    ifthenlist: IFTHENLIST;
  32.  
  33.    else_compound: COMPOUND;
  34.      -- Not Void if any.
  35.  
  36. feature {NONE}
  37.  
  38.    current_type: TYPE;
  39.  
  40. feature {NONE}
  41.  
  42.    make(sp: like start_position) is
  43.       do
  44.      start_position := sp;
  45.       end;
  46.  
  47. feature
  48.  
  49.    is_pre_computable: BOOLEAN is false;
  50.  
  51.    end_mark_comment: BOOLEAN is true;
  52.  
  53. feature
  54.  
  55.    use_current: BOOLEAN is
  56.       do
  57.      if ifthenlist.use_current then
  58.         Result := true;
  59.      elseif else_compound /= Void then
  60.         Result := else_compound.use_current;
  61.      end;
  62.       end;
  63.  
  64.    stupid_switch(r: ARRAY[RUN_CLASS]): BOOLEAN is
  65.       do
  66.      Result := ifthenlist.stupid_switch(r) and then
  67.      (else_compound = Void or else else_compound.stupid_switch(r));
  68.       end;
  69.  
  70.    afd_check is
  71.       do
  72.      ifthenlist.afd_check;
  73.      if else_compound /= Void then
  74.         else_compound.afd_check;
  75.      end;
  76.       end;
  77.  
  78.    collect_c_tmp is
  79.       do
  80.      ifthenlist.collect_c_tmp;
  81.       end;
  82.  
  83.    compile_to_c is
  84.       local
  85.      static_value: INTEGER;
  86.       do
  87.      check
  88.         ifthenlist.count > 0
  89.      end;
  90.      cpp.put_string("/*[IF*/%N");
  91.      static_value := ifthenlist.compile_to_c;
  92.      inspect
  93.         static_value
  94.      when static_false then
  95.         cpp.put_string("/*AE*/%N");
  96.         if else_compound /= Void then
  97.            else_compound.compile_to_c;
  98.         end;
  99.      when static_true then
  100.      when non_static then
  101.         if else_compound /= Void then
  102.            cpp.put_string(fz_else);
  103.            cpp.put_string(fz_11);
  104.            else_compound.compile_to_c;
  105.            cpp.put_string(fz_12);
  106.         end;
  107.      end;
  108.      cpp.put_string("/*FI]*/%N");
  109.       end;
  110.  
  111.    compile_to_jvm is
  112.       local
  113.      static_value: INTEGER;
  114.       do
  115.      check
  116.         ifthenlist.count > 0
  117.      end;
  118.      static_value := ifthenlist.compile_to_jvm;
  119.      inspect
  120.         static_value
  121.      when static_false then
  122.         -- Always else :
  123.         if else_compound /= Void then
  124.            else_compound.compile_to_jvm;
  125.         end;
  126.      when static_true then
  127.         -- Never else :
  128.         ifthenlist.compile_to_jvm_resolve_branch;
  129.      when non_static then
  130.         -- Else is possible :
  131.         if else_compound /= Void then
  132.            else_compound.compile_to_jvm;
  133.         end;
  134.         ifthenlist.compile_to_jvm_resolve_branch;
  135.      end;
  136.       end;
  137.  
  138.    to_runnable(ct: TYPE): like Current is
  139.       local
  140.      ne: INTEGER;
  141.      itl: like ifthenlist;
  142.      ec: like else_compound;
  143.       do
  144.      ne := nb_errors;
  145.      if current_type = Void then
  146.         current_type := ct;
  147.         itl := ifthenlist.to_runnable(ct);
  148.         if itl = Void then
  149.            check
  150.           nb_errors - ne > 0
  151.            end;
  152.         else
  153.            ifthenlist := itl;
  154.         end;
  155.         if nb_errors - ne = 0 and then else_compound /= Void then
  156.            ec := else_compound.to_runnable(ct);
  157.            if ec = Void then
  158.           check
  159.              nb_errors - ne > 0
  160.           end;
  161.            else
  162.           else_compound := ec;
  163.            end;
  164.         end;
  165.         if itl /= Void then
  166.            Result := Current
  167.         end;
  168.      else
  169.         Result := twin;
  170.         Result.clear_current_type;
  171.         Result := Result.to_runnable(ct);
  172.      end;
  173.       end;
  174.  
  175.    add_if_then(expression: EXPRESSION; then_compound: COMPOUND) is
  176.       require
  177.      expression /= void;
  178.       local
  179.      ifthen: IFTHEN;
  180.       do
  181.      !!ifthen.make(expression,then_compound);
  182.      if ifthenlist = Void then
  183.         !!ifthenlist.make(ifthen);
  184.      else
  185.         ifthenlist.add_last(ifthen);
  186.      end;
  187.       end;
  188.  
  189.    pretty_print is
  190.       do
  191.      check
  192.         ifthenlist.count > 0;
  193.      end;
  194.      fmt.keyword("if");
  195.      ifthenlist.pretty_print;
  196.         if else_compound /= Void then
  197.            fmt.indent;
  198.            fmt.keyword("else");
  199.            else_compound.pretty_print;
  200.         end;
  201.         fmt.indent;
  202.         if fmt.semi_colon_flag then
  203.            fmt.keyword("end;");
  204.         else
  205.            fmt.keyword("end");
  206.         end;
  207.         if fmt.print_end_if then
  208.            fmt.put_end("if");
  209.            end;
  210.         end;
  211.  
  212. feature {IFTHENELSE}
  213.  
  214.    clear_current_type is
  215.       do
  216.      current_type := Void;
  217.       ensure
  218.      current_type = Void
  219.       end;
  220.  
  221. feature {EIFFEL_PARSER}
  222.  
  223.    set_else_compound(ec: like else_compound) is
  224.       do
  225.      else_compound := ec;
  226.       ensure
  227.      else_compound = ec;
  228.       end;
  229.  
  230. end -- IFTHENELSE
  231.  
  232.